/* 上传资源（图片，视频等，可自行扩展）相关逻辑 */
import { reactive, ref, isRef, isReactive } from 'vue';
import { ElMessage } from 'element-plus';
import { api as Request } from '@/utils/api';
import { chackImageType, chackVideoType } from '@/shared/index.js';

/**
 * 
 * @param {RefImpl} disabledbtn 按钮可用与不可用 (不是ref的话，不做操作)
 * @param {RefImpl} formLoading 表单loading状态
 * @returns 
 */
export const useUpload = (disabledbtn, formLoading) => {
  /* 上传图片到七牛云的token与图片名称 */
  const uploadData = reactive({ token: '', key: '' });

  /**
   * 删除图片（暂不考虑对象嵌套深的情况）
   * @param {Proxy} obj 删除属性的对象
   * @param {String} key 删除属性的名称
   */
  function handleDeleteResources (obj, key) {
    isReactive(obj) && (obj[key] = '');
  }

  /**
   * 图片上传成功（暂不考虑对象嵌套深的情况）
   * @param {object} response 七牛云返回的资源信息
   * @param {Proxy} obj 赋值属性的对象
   * @param {string} key 赋值属性的名称
   * @param {function} handleCustomOperation 自定义执行函数（传入上传成功的地址）
   */
  function handleResourcesUploadSuccess (response, obj, key, handleCustomOperation) {
    isRef(formLoading) && (formLoading.value = false);
    isRef(disabledbtn) && (disabledbtn.value = false);
    isReactive(obj) && (obj[key] = '/' + response.key);
    handleCustomOperation && handleCustomOperation(response);
  }

  /**
   * 图片上传失败
   * @param {*} err 
   * @param {*} file 
   * @param {*} fileList 
   */
  function handleResourcesUploadError (err, file, fileList) {
    isRef(formLoading) && (formLoading.value = false);
    isRef(disabledbtn) && (disabledbtn.value = false);
    ElMessage.warning('上传失败，请关闭该页面后再重新上传');
  }

  /**
   * 上传图片之前的操作（图片大小判断,类型判断，自定义图片名称与上传token，还可以做图片的压缩，压缩功能暂时没做）
   * @param {File} file 图片资源
   * @param {number} limit 图片大小限制
   * TODO：可以再传一个参数，是需要图片，还是视频，还是资源
   * @returns 
   */
  function handleBeforeUpload (file, limit = 200) {
    if (chackVideoType(file.type)) {
      ElMessage.warning(`请上传图片!`);
      return false;
    }
    isRef(formLoading) && (formLoading.value = true);
    isRef(disabledbtn) && (disabledbtn.value = true);
    const isLimit = file.size / 1024 <= limit;
    if (!isLimit) {
      ElMessage.warning(`上传图片大小不能超过${limit}K,请压缩后再上传!`);
      isRef(formLoading) && (formLoading.value = false);
      isRef(disabledbtn) && (disabledbtn.value = false);
      return false;
    }
    const suffix = file.type.split('/')[1];
    return useResourceToken(suffix);
  }

  /**
   * 上传视频之前的操作（视频大小判断,类型判断，自定义图片名称与上传token，还可以做图片的压缩，压缩功能暂时没做）
   * @param {File} file 视频资源
   * @param {number} limit 视频大小限制
   * @returns 
   */
  function handleBeforeVideoUpload (file, limit = 10) {
    console.log(file);
    console.log(chackImageType(file.type));
    if (chackImageType(file.type)) {
      ElMessage.warning(`请上传视频!`);
      return false;
    }
    isRef(formLoading) && (formLoading.value = true);
    isRef(disabledbtn) && (disabledbtn.value = true);
    const isLimit = file.size / 1024 / 1024 <= limit;
    if (!isLimit) {
      ElMessage.warning(`上传视频大小不能超过${limit}M,请压缩后再上传!`);
      isRef(formLoading) && (formLoading.value = false);
      isRef(disabledbtn) && (disabledbtn.value = false);
      return false;
    }
    const suffix = file.type.split('/')[1];
    return useResourceToken(suffix);
  }

  /* 获取上传的token */
  function useResourceToken (suffix) {
    /* 获取七牛云token */
    return Request.getUploadToken({ suffix })
      .then((res) => {
        if (res.status === 1) {
          uploadData.token = res.result.upToken;
          uploadData.key = res.result.fileName[0];
        } else {
          ElMessage.error(res.msg);
        }
      })
      .catch((res) => {
      });
  }

  return {
    uploadData,
    handleBeforeVideoUpload, handleDeleteResources,
    handleResourcesUploadSuccess, handleBeforeUpload, handleResourcesUploadError
  }
}